package park;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.util.Scanner;

import park.model.SungJuk2VO;

public class J22SungJuk {
	
	//성적처리를 JDBC로 구현
	//오라클 데이터베이스를 이용해서
	//성적 데이터 저장,조회,수정,삭제를 처리
	
	//JDBC 객체 및 연결 정보
	
	private static String DRV = "oracle.jdbc.driver.OracleDriver";
	private static String URL = "jdbc:oracle:thin:@112.216.253.124:1521:xe";
	private static String USR = "pjandpd";
	private static String PWD = "pjandpd";

	public static void main(String[] args) {
		Scanner sc = null;
		String result = "";
		
		while(true){ 	//while 문에서 (true)는 무한반복!
		
			System.out.println("JDBC 성적처리 프로그램V1");
			System.out.println("--------------------------------------------------");
			System.out.println("1 : 새로운 성적 데이터 추가");
			System.out.println("2 : 전체 성적 데이터 출력");
			System.out.println("3 : 성적 데이터 조회");
			System.out.println("4 : 성적 데이터 수정");
			System.out.println("5 : 성적 데이터 삭제");
			System.out.println("0 : 프로그램 종료");
			System.out.println("--------------------------------------------------");
			System.out.print(" 실행할 작업을 선택하세요 : ");
			sc = new Scanner(System.in);
			
			switch(sc.nextInt()){
				case 1: result = newSungJuk(); break;
				case 2: result = readSungJuk(); break;
				case 3: result = readOneSungJuk(); break;
				case 4: result = modifySungJuk(); break;
				case 5: result = removeSungJuk(); break;
				case 0: sc.close(); System.exit(0); break;
				default : result = "잘못 입력하셨습니다";
			}
			
			System.out.println(result);
			
		}
		
	}//main
	
	//성적 데이터 입력
	
	public static String newSungJuk(){
		Connection conn = null;
		PreparedStatement pstmt = null; //sql문 실행할때 씀
		
		String result = "";
		String sql = "insert into sungjuk" + "(sjno,name,kor"
				+ ",eng,mat,tot,avgs,grd)" + "values (sjno.nextval,?,?,?,?,?,?,?)";
		Scanner sc = new Scanner(System.in);
		
		System.out.println("성적데이터를 입력합니다");
		System.out.println("이름 , 국어 , 영어 ,수학순으로 입력하세요");
		SungJuk2VO sj = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt());
		
	//총점 , 평균 , 학점계산
		
		computeSungJuk(sj);
		
	//sungjuk 테이블에 데이터 입력	
		
		try{
			Class.forName(DRV); //Class 대소문자 구별
			conn = DriverManager.getConnection(URL,USR,PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, sj.getName()); //? 에 무엇을 넣을 것인지..
			pstmt.setInt(2, sj.getKor());
			pstmt.setInt(3, sj.getEng());
			pstmt.setInt(4, sj.getMat());
			pstmt.setInt(5, sj.getTot());
			pstmt.setDouble(6, sj.getAvg());
			pstmt.setString(7, String.valueOf(sj.getGrd()));
			
		//	pstmt.setString(7, sj.getGrd()+""); 가능
		//	pstmt.setString(7, String.valueOf(sj.getGrd()); 어떤것이든지 String으로 바꿔준다
			
		int cnt = pstmt.executeUpdate();
		
		if(cnt > 0){
			result = cnt + "건의 데이터가 입력됨";
		}
			
		}catch(Exception ex){
			ex.printStackTrace(); //오류가 나면 내용 확인
		}finally{ //자원 비우기
			// pstmt , conn 을 꼭넣어야 오라클 써버가 죽지 않는다
			if(pstmt != null)
				try{
					pstmt.close();
				}catch (Exception e) {
					
			}
			
			if(conn != null)
				try{
					conn.close();
				}catch (Exception e) {
					
				}
			}
		return result;
	}
	
	//성적 데이터 전체조회
	
	public static String readSungJuk(){
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null; //select 문 실행시에만 , 결과받기함수
		String sql = " select * from sungjuk ";
		sql += " order by sjno ";
		
		StringBuilder sb = new StringBuilder(); //append 사용하기위해
		
		System.out.println("전체 성적 데이터를 출력합니다.");
		
		try{
			Class.forName(DRV); // "oracle.jdbc.driver.OracleDriver";
			conn = DriverManager.getConnection(URL,USR,PWD);
			//Statement 생성
			//Statement 을 사용했을때 executeQuery(조회용) 
			//Statement 을 사용했을때 executeUpdate(수정용) 
			//둘중하나 무조건 사용
			pstmt = conn.prepareStatement(sql); //미리 sql문 생성 
			//prepareStatement 보안,실행속도 향상 
			//실행효율이 높아짐 컴파일 된 파일을 실행하므로(다음번에 실행할때는 컴파일 없음) 
			//Statement은 매번 실행할때마다 반복적으로 컴파일을 해야한다. (부하가 걸리게됨) 
			rs = pstmt.executeQuery(); // 실행
			
			while(rs.next()){
			  sb.append(rs.getString(1)).append("/")
				.append(rs.getString(2)).append("/")
				.append(rs.getString(3)).append("/")
				.append(rs.getString(4)).append("/")
				.append(rs.getString(5)).append("/")
				.append(rs.getString(6)).append("/")
				.append(rs.getString(7)).append("/")
				.append(rs.getString(8)).append("/")
				.append(rs.getString(9)).append("\n");
			}
			
			}catch(Exception ex){
				ex.printStackTrace();
			}finally{
				
			}
			
				if(rs != null){
					try{
						rs.close();
					}catch(Exception e){
						
					}
					
				if(pstmt != null){
					try{
						pstmt.close();
					}catch(Exception e){
						
					}
					
				if(conn != null){
					try{
						conn.close();
					}catch(Exception e){
						
					}	
				}
			}
		}
		return sb.toString();
	}
	
	//성적 데이터 검색
	
	public static String readOneSungJuk(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = " select * from sungjuk "; // 띄어쓰기 주의
		sql += " where name = ? order by sjno ";
		StringBuilder sb = new StringBuilder();
		Scanner sc = new Scanner(System.in);
		
		System.out.println("이름으로 성적데이터를 조회합니다");
		System.out.println("조회할 성적데이터의 이름을 입력하세요");
		
		String name = sc.next();
		
		try{
			Class.forName(DRV);   //묻지마 외워
			conn = DriverManager.getConnection(URL, USR, PWD); //묻지마 외워
			pstmt = conn.prepareStatement(sql); //묻지마 외워
			
			pstmt.setString(1, name); //sql문에 ? 가 있냐 없냐 있으면 이걸 씀
			
			rs = pstmt.executeQuery(); //select문을 수행할 때 사용
			
			sb.append("=================================")
		  	.append("\n");
			
			while(rs.next()){
				sb.append(rs.getString(1)).append("/")
				.append(rs.getString(2)).append("/")
				.append(rs.getString(3)).append("/")
				.append(rs.getString(4)).append("/")
				.append(rs.getString(5)).append("/")
				.append(rs.getString(6)).append("/")
				.append(rs.getString(7)).append("/")
				.append(rs.getString(8)).append("/")
				.append(rs.getString(9)).append("\n");
			}
			
		}catch(Exception ex){
			ex.printStackTrace();
		}finally{
			
			if(rs != null){
				try{
					rs.close();
				}catch(Exception ex){
					
				}
				
			}
			
			if(pstmt != null){
				try{
					pstmt.close();
				}catch(Exception ex){
					
				}
				
			}
			
			if(conn != null){
				try{
					conn.close();
				}catch(Exception ex){
					
				}
				
			}
			
		}
		
		return sb.toString();
	}
		
	
	//성적 데이터 수정
		
	public static String modifySungJuk(){
	
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = " update sungjuk set name = ? , kor = ? , eng = ? , ";
		sql += " mat = ? , tot = ? , avgs = ? , grd = ? , " ;
		sql	+= " regdate = sysdate where name = ? ";
		Scanner sc = new Scanner(System.in);
		String result="";
		
		System.out.println("기존 성적 데이터를 수정합니다");
		System.out.println("수정할성적 데이터의 이름을 입력하세요");
		String name = sc.next();
		System.out.println("이름 국어 영어 수학순으로 입력하세요");
		SungJuk2VO sj = new SungJuk2VO(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt());
		
		computeSungJuk(sj);
		
		try{
			
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL,USR,PWD);
			pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, sj.getName());
				pstmt.setInt(2, sj.getKor());
				pstmt.setInt(3, sj.getEng());
				pstmt.setInt(4, sj.getMat());
				pstmt.setInt(5, sj.getTot());
				pstmt.setDouble(6, sj.getAvg());
				pstmt.setString(7, String.valueOf(sj.getGrd()));
				pstmt.setString(8, name);
			int cnt	= pstmt.executeUpdate();
			
	
			if(cnt > 0){
				result = cnt + "건의 데이터가 수정되었어요";
			}
			
		}catch(Exception ex){
			
		}finally{
			if(pstmt != null){
				try{
					pstmt.close();
				}catch(Exception ex){
					
				}
			}
			
			if(pstmt !=null){
				try{
					conn.close();
				}catch(Exception ex){
					
				}
			}
		}
		return result;
	}
		
	//성적 데이터 삭제
	
	public static String removeSungJuk(){
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = " delete from sungjuk where name = ? ";
		Scanner sc = new Scanner(System.in);
		String result ="";
		
		System.out.println("선택한 성적 데이터를 삭제합니다");
		System.out.println("삭제할  성적 데이터의 이름을 삭제합니다");
		String name = sc.next();
		
		try{
			Class.forName(DRV);
			conn = DriverManager.getConnection(URL,USR,PWD);
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, name);
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0){
				System.out.println(cnt + "건의 데이터가 삭제되었어요");
			}
			
		}catch(Exception ex){
			
		}finally{
			
			try{
			if(pstmt !=null){
				pstmt.close();
			}
			}catch(Exception ex){
				
			}
			
			try{
				if(conn !=null){
					conn.close();
				}
			}catch(Exception ex){
				
			}
		}
		return result;
	}
	
	//성적 데이터 총점,평균,학점 계산
	
	public static void computeSungJuk(SungJuk2VO sj){

		String dfmt = "###.##";
		
		sj.setTot(sj.getKor() + sj.getEng() + sj.getMat());
		
		DecimalFormat df = new DecimalFormat(dfmt); //소수점자리 컷
		String avg = df.format((double)sj.getTot()/3);
		sj.setAvg(Double.parseDouble(avg));
		
		//sj.setAvg((double)sj.getTot()/3);
		
		//스위치문에는 인트랑 스트링형만 들어감
		switch((int)sj.getAvg()/10){
			case 10 : 
			case 9 : sj.setGrd('수');break; 
			case 8 : sj.setGrd('우');break; 
			case 7 : sj.setGrd('미');break; 
			case 6 : sj.setGrd('양');break; 
			default :sj.setGrd('가');
		}
	}
	
}//class
